package com.util.encrypt;

import org.apache.commons.lang3.StringUtils;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;


public class AesEncryptUtil {
	/**
	 * 密钥长度必须是16
	 */
	public static final String defaultKey = "qwertyabcd123456";
	/**
	 * 算法
	 */
	private static final String ALGORITHMSTR = "AES/ECB/PKCS5Padding";
	private static String aesKey = "297796CCB81D2553";

	public static void main(String[] args) throws Exception {
		System.out.println("加密前：" + "admin123");

		System.out.println("加密密钥和解密密钥：" + defaultKey);

		String encrypt = encrypt("admin123", defaultKey);
		System.out.println("加密后：" + encrypt);

		String decrypt = decrypt(encrypt, defaultKey);
		System.out.println("解密后：" + decrypt);

		System.out.println(encrypt128("address=127.0.0.1&user=admin&password=admin@aaa123&fixaddr=1"));
		System.out.println(decrypt128(
				"hc5iBaDAmyS8GHAN9mG6TZBvcabukESZZgYHB6Ah7EROZg76T497PtTp2UXhH3LN3jabaqqK28HUwe23etr6Vw=="));

		// 加密
		String bb = "admin" + ":" + MD5Utils.md5("Sensepower@2022");
		String aa = Base64.getEncoder().encodeToString(bb.getBytes());
		System.out.println("token：" + "Basic "+aa);
	}

	public static String decryptByDefaultKey(String encrypt) throws Exception {
		return decrypt(encrypt, defaultKey);
	}

	/**
	 * aes加密
	 *
	 * @param content
	 * @return
	 * @throws Exception
	 */
	public static String encryptByDefaultKey(String content) throws Exception {
		return encrypt(content, defaultKey);
	}

	/**
	 * base 64 encode
	 *
	 * @param bytes 待编码的byte[]
	 * @return 编码后的base 64 code
	 */
	private static String base64Encode(byte[] bytes) {
		return Base64.getEncoder().encodeToString(bytes);
	}

	/**
	 * base 64 decode
	 *
	 * @param base64Code 待解码的base 64 code
	 * @return 解码后的byte[]
	 * @throws Exception
	 */
	private static byte[] base64Decode(String base64Code) throws Exception {
		return StringUtils.isEmpty(base64Code) ? null : Base64.getDecoder().decode(base64Code);
	}

	/**
	 * AES加密
	 *
	 * @param content    待加密的内容
	 * @param encryptKey 加密密钥
	 * @return 加密后的byte[]
	 * @throws Exception
	 */
	private static byte[] aesEncryptToBytes(String content, String encryptKey) throws Exception {
		KeyGenerator kgen = KeyGenerator.getInstance("AES");
		kgen.init(128);
		Cipher cipher = Cipher.getInstance(ALGORITHMSTR);
		cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(encryptKey.getBytes(), "AES"));

		return cipher.doFinal(content.getBytes("utf-8"));
	}
	/**
	 * AES加密
	 *
	 * @param content    待加密的内容
	 * @return 加密后的byte[]
	 * @throws Exception
	 */
	private static byte[] aesEncryptToBytes(String content) throws Exception {
		KeyGenerator kgen = KeyGenerator.getInstance("AES");
		kgen.init(128);
		Cipher cipher = Cipher.getInstance(ALGORITHMSTR);
		cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(null,"AES"));

		return cipher.doFinal(content.getBytes("utf-8"));
	}

	/**
	 * AES加密为base 64 code
	 *
	 * @param content    待加密的内容
	 * @param encryptKey 加密密钥
	 * @return 加密后的base 64 code
	 * @throws Exception
	 */
	public static String encrypt(String content, String encryptKey) throws Exception {
		return base64Encode(aesEncryptToBytes(content, encryptKey));
	}

	/**
	 * AES解密
	 *
	 * @param encryptBytes 待解密的byte[]
	 * @param decryptKey   解密密钥
	 * @return 解密后的String
	 * @throws Exception
	 */
	private static String aesDecryptByBytes(byte[] encryptBytes, String decryptKey) throws Exception {
		KeyGenerator kgen = KeyGenerator.getInstance("AES");
		kgen.init(128);
		Cipher cipher = Cipher.getInstance(ALGORITHMSTR);
		cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(decryptKey.getBytes(), "AES"));
		byte[] decryptBytes = cipher.doFinal(encryptBytes);
		return new String(decryptBytes);
	}

	/**
	 * 将base 64 code AES解密
	 *
	 * @param encryptStr 待解密的base 64 code
	 * @param decryptKey 解密密钥
	 * @return 解密后的string
	 * @throws Exception
	 */
	public static String decrypt(String encryptStr, String decryptKey) throws Exception {
		return StringUtils.isEmpty(encryptStr) ? null : aesDecryptByBytes(base64Decode(encryptStr), decryptKey);
	}

	/**
	 * AES算法128位加密
	 *
	 * @param cleartext
	 * @return
	 */
	public static String encrypt128(String cleartext) {
		try {
			Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
			SecretKeySpec skeySpec = new SecretKeySpec(aesKey.getBytes("UTF-8"), "AES");
			cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
			byte[] encrypted = cipher.doFinal(cleartext.getBytes("UTF-8"));

			return Base64.getEncoder().encodeToString(encrypted);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * AES算法128位解密
	 *
	 * @param encrypMsg
	 * @return
	 */
	public static String decrypt128(String encrypMsg) {
		try {
			Cipher cipher = Cipher.getInstance("AES");
			SecretKeySpec keySpec = new SecretKeySpec(aesKey.getBytes(), "AES");
			cipher.init(Cipher.DECRYPT_MODE, keySpec);
			byte[] decbbdt = cipher.doFinal(Base64.getDecoder().decode(encrypMsg));

			return new String(decbbdt, "UTF-8");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

}
